跳到主要内容

搭建 Gym 环境

Gym 是什么?

OpenAI Gym 是一个广泛使用的强化学习工具库,它提供了一系列标准化的环境,使研究人员和开发者能够开发和比较强化学习算法。这些环境涵盖了从简单的控制任务到复杂的游戏,如 Atari 游戏。

不过目前 OpenAI Gym 已经升级为 Gymnasium。这个变化是为了继续支持和发展原有的 OpenAI Gym 环境,同时解决了一些旧版本的限制和问题。Gymnasium 旨在作为 OpenAI Gym 的自然继承者,保持向后兼容,同时引入新的特性和改进。

pip install gymnasium

根据需要安装附加环境,如 Atari、Box2D 等。

pip install gymnasium[atari]
pip install gymnasium[box2d]

编写一个简单的 Python 脚本来测试 Gym 环境:

import gym

env = gym.make("CartPole-v1", render_mode="rgb_array")
env.reset()

for _ in range(1000):
action = env.action_space.sample() # 选择一个随机动作
observation, reward, terminated, truncated, info = env.step(action) # 执行动作并获取结果
if terminated or truncated:
break
env.close()

Atari 和 Box2D 库

AtariBox2D 是两种在强化学习研究中常用的环境类型,它们提供了不同的挑战和场景来测试和发展强化学习算法。

Atari 环境是一系列基于经典 Atari 2600 视频游戏的模拟环境。这些环境通常通过像素数据和游戏得分作为输入和反馈,为算法提供了一个复杂且富有挑战性的测试场景。

由于 Atari 游戏是基于像素的,所以它们经常用于测试算法在处理视觉输入方面的能力。它包括各种游戏,如《乒乓》(Pong)、《打砖块》(Breakout)和《太空入侵者》(Space Invaders)。且 Atari 环境在强化学习研究中被广泛用作基准测试,用于评估和比较不同算法的性能。

Box2D 环境是一组基于 Box2D 物理引擎的模拟环境。这些环境重点在于模拟物理交互,如重力、碰撞和摩擦力。它提供了一个复杂的物理世界,算法需要学习如何在这个世界中有效地控制对象,这些环境通常涉及控制任务,如移动机器人臂或驾驶车辆,需要精细的连续动作控制。

测试 FrozenLake-v0 环境

FrozenLake-v0 是一个 4*4 的网络格子,每个格子可以是起始块,目标块、冻结块或者危险块。

我们的目标是让 agent 学习从开始块如何行动到目标块上,而不是移动到危险块上。agent 可以选择向上、向下、向左或者向右移动,同时游戏中还有可能吹来一阵风,将 agent 吹到任意的方块上。在这种情况下,每个时刻都有完美的策略是不能的,但是如何避免危险洞并且到达目标洞肯定是可行的。

更通俗一点地讲,就是冬天来了,你和你的朋友在公园里玩飞盘的时候,你把飞盘扔到了湖中央。水大部分都已冻结,但也有一些地方融化出了几个洞。如果你踏进其中一个洞,你就会掉进冰冷的水里。在这个时候,由于没有其他的飞盘,所以必须穿过湖面并取回光盘。然而,冰是滑的,所以你不会总是朝着你想要的方向前进。

import gymnasium as gym

# 创建环境,指定渲染模式
env = gym.make("FrozenLake-v1", is_slippery=True, map_name="4x4", render_mode="human")

num_episodes = 10 # 定义训练的回合数

for episode in range(num_episodes):
state = env.reset()
terminated = False
truncated = False

while not terminated and not truncated:
action = env.action_space.sample() # 随机选择动作
next_state, reward, terminated, truncated, info = env.step(action) # 执行动作

print(f"Episode: {episode}, State: {state}, Action: {action}, Reward: {reward}, Next State: {next_state}, Terminated: {terminated}, Truncated: {truncated}")

state = next_state

env.close()

这里的 is_slippery (bool): 当设置为 True 时,它会使环境变得“滑”,意味着智能体在试图向一个方向移动时,有一定的概率会滑向其他方向。例如,如果智能体试图向北移动,它可能会因为“滑”而意外地向东或西移动。这种不确定性增加了环境的复杂性和挑战性,因为智能体需要学习如何在不确定的动态中做出最佳决策。

在这个示例中,我们将会看到在每一步如何根据当前的状态随机选择动作,以及这些动作如何影响下一个状态和奖励。